<?php
/**
 * レスポンスクラス定義ファイル
 * 
 * レスポンス基底クラス<br>
 * Smarty向け関数<br>
 * Smartyレスポンスクラス<br>
 * が含まれています
 */

/**
 * レスポンス基底クラス
 *
 */
abstract class Response {
	/**
	 * テンプレートファイルを設定する
	 *
	 * @param string $fileName テンプレートファイル名
	 */
	abstract public function setTemplate($fileName);
	
	/**
	 * テンプレートに変数を割り当てる
	 * 
	 * @param string $objName テンプレート上での変数名
	 * @param mixed|SimpleXMLElement $valueObject 割り当てられる変数またはバリューオブジェクト
	*/
	abstract public function assign($objName,$valueObject);
	
	/**
	 * outputメソッド
	 *
	 * 出力を行う
	 */
	abstract public function output();
}

/**
 * Smartyクラスを読み込み
 *
 */
require_once(SMARTY_LIB_PATH.'Smarty.class.php');

/**
 * SmartyにContent-typeを出力させる
 *
 * テンプレート内では以下の行を行頭に置くことでContent-typeを強制できる
 * {insert name=header content="Content-Type: text/xml"}
 * 
 * @param string $params "Content-Type: text/xml"など
 */
function insert_header($params)
{
   if (empty($params['content'])) {
       return;
   }
   header($params['content']);
   return;
}

/**
 * Smartyレスポンスクラス
 * 
 * Smartyによるビュー出力の実装
 */
class SmartyResponse extends Response {
	/**
	 * Smartyオブジェクト
	 *
	 * @var object
	 */
	protected $smarty = null;
	
	/**
	 * テンプレートファイル名
	 *
	 * @var string
	 */
	protected $templateFile = '';
	
	/**
	 * コンストラクタ
	 * 
	 */
	function __construct() {
		$this->smarty = new Smarty();
		$this->smarty->template_dir = SMARTY_TMP_PATH.'templates/';
		$this->smarty->compile_dir = SMARTY_TMP_PATH.'templates_c/';
		$this->smarty->cache_dir = SMARTY_TMP_PATH.'cache/';
		$this->smarty->config_dir = SMARTY_TMP_PATH.'configs/';
	}
	
	/**
	 * テンプレートファイルを設定する
	 *
	 * @param string $fileName テンプレートファイル名
	 */
	public function setTemplate($fileName) {
		$this->templateFile = $fileName;
	}
	
	/**
	 * テンプレートに変数を割り当てる
	 * 
	 * @param string $objName テンプレート上での変数名
	 * @param mixed|SimpleXMLElement $valueObject 割り当てられる変数またはバリューオブジェクト
	*/
	public function assign($objName,$valueObject) {
		$this->smarty->assign($objName, $valueObject);
	}
		
	/**
	 * 出力する
	 * 
	 */
	public function output() {
		if ($this->smarty->template_exists($this->templateFile)) {
			$this->smarty->display($this->templateFile);
		} else {
			throw new Exception('テンプレートファイル['.$this->templateFile.']が見つかりません');
		}
	}
}
